<?php
class JobCollection
{
	protected $iFeedId = null;
	
	protected $oTimeHelper = null;
	
	public function __construct($iFeedId)
	{
		$this->iFeedId = $iFeedId;
	}
	
	protected function getFeedId()
	{
		return $this->iFeedId;
	}
	
	protected function startJob()
	{
		$this->oTimeHelper = new TimeHelper();
		$this->oTimeHelper->startClock();
	}
	
	protected function finishJob($aData, $sFunctionName, $sJobType)
	{
		$sFileName = $this->saveData($aData, $sJobType);
		$iTime = $this->oTimeHelper->stopClock();
		
		$aReport = array('function' => $sFunctionName,
					'elapsed_time' => $iTime,
					'saved_to' => $sFileName
		);
		
		return $aReport;
	}
	
	/**
	 * Diese Funktion setz die Spaltennamen fuer den Feed
	 * sku - name - preis - link      <-- Diese Zeile wird definiert
	 * 122 - auto - 12.99 - http://...
	 * 100 - bild - 29.99 - http://...
	 * @param Row $oRow
	 */
	public function setColumns()
	{
		$this->startJob();
		$oRow = new Row($this->getFeedId());
		
		$aColumns = array();
		
		/* @var $oRow Row */
		$aFields = $oRow->getFields();
		foreach ($aFields as $oField)
		{
			/* 
			 * @TODO Hier fehlt noch die Möglichkeit für Hierarchien in XMLs,
			 * also dass Spalten Kinder und Eltern haben können 
			 */
			$aColumns[] = $oField;
		}
		
		return $this->finishJob($aColumns, __FUNCTION__, 'columns');
	}

	
	/**
	 * Hier werden die Datenzeilen ermittelt und nachher in eine Datei geschrieben
	 * @return multitype:unknown string
	 */
	public function setDataBody()
	{
		$this->startJob();

		$oFetcher = new Fetcher();
		$aData = $oFetcher->receiveData($this->getFeedId());
		
		foreach ($aData as $oData)
		{
			$aBody[] = $oData;
		}
		
		return $this->finishJob($aBody, __FUNCTION__, 'databody');
	}
	
	
	
	public function transformFields()
	{
		$this->startJob();
		
		$aRows = $this->readData('databody');
		/*
		 * Was passiert wenn $aRows immernoch leer ist? Also vorher der setDatabody Job nicht gelaufen ist?
		 * Dann sollte eine Logik diesen Job nachholen und einen Alert werfen, denn dann stimmt die Reihenfolge der Jobs nicht,
		 * oder der Databody Job existiert in der Liste der Jobs nicht.
		 */
		
		foreach ($aRows as $oRow)
		{
			/* @var $oRow Row */
			$aFields = $oRow->getFields();
			foreach ($aFields as $oField)
			{
				/* @var $oField Field */
				$oField->doTransformations();
			}
		}
		
		// An dieser Stelle sollen die transformierten Rows gespeichert werden.
		// Vorschlag: serialisieren und dann in eine Textdatei oder Datenbanktabelle
		// Der Job der den Feed dann erzeugt soll auch lösgelöst von den vorherigen Jobs passieren können
		// Also wird dann nur die Dateieingeladen wieder unserialisiert und dann in das Zielformat gebracht (XML, CSV oder Direktausgabe) 
		return $this->finishJob($aRows, __FUNCTION__, 'transformed');
	}
	
	
	/*
	 * Diese Methode ermittelt anhand von Black und Whitelist die ProduktSKUs
	 * die im Feed enthalten sein werden und speichert diese Liste in eine Datei
	 * 
	 */
	public function refreshFetchList()
	{
		
	}
	
	
	
	protected function saveData($aRows, $sJobType)
	{
		$oFileHelper = new FileHelper();
		
		$sContent = serialize($aRows);
		
		/*
		 * @TODO Pfad zum Speichern soll in einer Configvariable gespeichert werden
		 */
		
		$sFileName = '/feeds/'.$this->getFeedId().'/'.date('Y-m-d_h-i-s').'/'.$sJobType.'.txt';
		$oFileHelper->writeContent($sFileName, $sContent);
		
		return $sFileName;
	}
	
	
	/**
	 * 
	 * @param string $sFile 
	 * @param string $sTimeStamp Hier kann man optional einen Zeitstempel angeben um eine Datei eines bestimmten Zeitpunkt zu ziehen
	 */
	protected function readData($sJobType, $sTimeStamp = null)
	{
		$oFileHelper = new FileHelper();
		
		if (empty($sTimeStamp))
		{
			/* @TODO Methode die den aktuellsten existierenden Timestamp aus der vorhandenen Ordnern ermitelt
		 	 * 2013-03-18_22-02-02 <-- Dies ist der aktuellste Ordner
		 	 * 2013-03-18_19-32-21
		 	 * 2013-03-17_18-33-21
		 	 * 2013-03-17_18-30-29
		 	 */
			// Hier wird ein Beispieltimestamp vorgegeben. Nur zu Veranschaulichungszwecken
			$sTimeStamp = '2013-03-18_22-02-02';
		}
		
		/*
		 * @TODO Pfad aus dem gelesen wird soll natürlich auch aus der Configvariable kommen
		*/
		
		$sFileName = '/feeds/'.$this->getFeedId().'/'.$sTimeStamp.'/'.$sJobType.'.txt';
		return $oFileHelper->readContent($sFileName);
	}
	
}